package sohsite.util.generico;

import java.util.Collection;

import org.hibernate.Criteria;
import org.hibernate.Session;

import sohsite.excecao.EntradaInexistenteException;
import sohsite.util.Conexao;

public abstract class RepositorioGenerico<Tipo> implements IRepositorioGenerico<Tipo> {
	
	private Class<?> classe;
		
	public RepositorioGenerico(Class<?> classe) {
		this.classe = classe;
	}
	
	public void inserir(Tipo tipo){
		Session sessao = Conexao.encontrarSessao();
		sessao.save(tipo);
		sessao.flush();			
	}
	
	public void atualizar(Tipo tipo){
		Session sessao = Conexao.encontrarSessao();
		sessao.update(tipo);
		sessao.flush();	
	}
	
	@SuppressWarnings("unchecked")
	public Tipo consultar(int codigo) throws EntradaInexistenteException{
		Session sessao = Conexao.encontrarSessao();
		Tipo tipo = (Tipo) sessao.get(classe,codigo);				
		if (tipo == null) {
			throw new EntradaInexistenteException();
		}
		return tipo;
	}
	
	public void deletar(Tipo tipo){
		Session sessao = Conexao.encontrarSessao();
		sessao.delete(tipo);
		sessao.flush();			
	}
	
	public void deletar(Integer id) throws EntradaInexistenteException{
		Session sessao = Conexao.encontrarSessao();
		sessao.delete(consultar(id));
		sessao.flush();			
	}

	@SuppressWarnings("unchecked")
	public Collection<Tipo> consultarTodos() {
		Session sessao = Conexao.encontrarSessao();
		Collection<Tipo> colecao = null;
		Criteria criterio = sessao.createCriteria(classe);
		colecao = criterio.list();
		return colecao;
	}	

}

